package com.wn.common.db.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.wn.common.db.dao.VideoListCacheDao
import com.wn.common.db.entity.VideoInfo

/**
 * @Author: wn
 * @Date: 2024/12/3 15:57
 * @Description: database定义数据库
 *
 * 数据库的增删改查读写应该放在非UI线程 查询自带异步操作 其他 需要 suspend
 * Schema 文件  清楚的知道  数据库的变更情况  排查问题
 * exportSchema = true   指定位置
 */
@Database(entities = [VideoInfo::class], version = 1, exportSchema = false)
abstract class DataBase : RoomDatabase() {

  abstract fun videoListDao(): VideoListCacheDao

// hilt RoomModule  替代

  companion object {
    private const val DB_NAME = "database_db"

    @Volatile
    private var instance: DataBase? = null

    @Synchronized // 保证线程安全
    fun getInstance(context: Context): DataBase =
      instance ?: Room.databaseBuilder(context, DataBase::class.java, DB_NAME)
        //是否允许在主线程查询，默认是false
        .allowMainThreadQueries()
        //数据库被创建或者被打开时的回调
        //.addCallback(callBack)
        //指定数据查询的线程池，不指定会有个默认的
        //.setQueryExecutor {  }
        //任何数据库有变更版本都需要升级，升级的同时需要指定migration，如果不指定则会报错
        //数据库升级 1-->2， 怎么升级，以什么规则升级
        .addMigrations()
        //设置数据库工厂，用来链接room和SQLite，可以利用自行创建SupportSQLiteOpenHelper，来实现数据库加密
        //.openHelperFactory()
        .build()
        .also { instance = it }
  }
}